<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('product_variants', function (Blueprint $table) {
            // 基础字段
            $table->id()->comment('变体ID');
            $table->foreignId('product_id')->constrained()->onDelete('cascade')->comment('关联产品ID');
            $table->string('sku')->unique()->comment('变体SKU，库存管理单位');
            $table->string('name')->comment('变体名称，如"深空黑色 128GB"');
            
            // 价格相关字段
            $table->decimal('price', 10, 2)->unsigned()->comment('变体价格，单位：元');
            $table->decimal('compare_price', 10, 2)->unsigned()->nullable()->comment('原价，用于显示折扣');
            $table->decimal('cost_price', 10, 2)->unsigned()->nullable()->comment('成本价格，用于利润计算');
            
            // 库存相关字段
            $table->integer('stock_quantity')->unsigned()->default(0)->comment('库存数量');
            $table->integer('low_stock_threshold')->unsigned()->default(5)->comment('低库存阈值，低于此数量时提醒');
            
            // 物理属性字段（优化后的精确类型）
            $table->decimal('weight', 8, 3)->nullable()->comment('重量，单位：千克，精确到克');
            $table->decimal('length', 8, 2)->nullable()->comment('长度，单位：厘米');
            $table->decimal('width', 8, 2)->nullable()->comment('宽度，单位：厘米');
            $table->decimal('height', 8, 2)->nullable()->comment('高度，单位：厘米');
            
            // 变体特有字段
            $table->string('barcode')->nullable()->comment('条形码，用于库存管理');
            $table->text('description')->nullable()->comment('变体描述，如"深空黑色，128GB存储"');
            $table->json('features')->nullable()->comment('变体特性，JSON数组格式');
            
            // 属性相关字段
            $table->json('attributes')->nullable()->comment('变体属性组合，JSON格式存储规格信息');
            
            // 覆盖标识字段（解决字段冗余问题）
            $table->boolean('overrides_price')->default(false)->comment('是否覆盖产品价格，true表示使用变体价格');
            $table->boolean('overrides_stock')->default(false)->comment('是否覆盖产品库存，true表示使用变体库存');
            $table->boolean('overrides_weight')->default(false)->comment('是否覆盖产品重量，true表示使用变体重量');
            $table->boolean('overrides_dimensions')->default(false)->comment('是否覆盖产品尺寸，true表示使用变体尺寸');
            
            // 状态字段
            $table->boolean('is_active')->default(true)->comment('是否启用，false表示下架');
            $table->boolean('is_default')->default(false)->comment('是否默认变体，用于产品详情页默认显示');
            
            // 排序和元数据字段
            $table->integer('sort_order')->default(0)->comment('排序权重，数值越大排序越靠前');
            $table->json('meta_data')->nullable()->comment('扩展元数据，JSON格式');
            
            // 审计字段
            $table->unsignedBigInteger('created_by')->nullable()->comment('创建人ID，关联用户表');
            $table->unsignedBigInteger('updated_by')->nullable()->comment('更新人ID，关联用户表');
            
            // 软删除和时间戳
            $table->softDeletes()->comment('软删除时间戳');
            $table->timestamps();
            
            // 索引优化
            $table->index(['product_id', 'is_active'], 'idx_variant_product_active')->comment('产品和状态组合索引，用于查询产品的有效变体');
            $table->index(['product_id', 'is_active', 'is_default'], 'idx_variant_product_active_default')->comment('产品、状态和默认变体组合索引，用于查询默认变体');
            $table->index(['stock_quantity', 'is_active'], 'idx_variant_stock_active')->comment('库存和状态组合索引，用于库存管理查询');
            $table->index(['product_id', 'sort_order'], 'idx_variant_product_sort')->comment('产品和排序组合索引，用于变体排序');
            $table->index('sku', 'idx_variant_sku')->comment('变体SKU索引，用于库存管理');
            $table->index('barcode', 'idx_variant_barcode')->comment('条形码索引，用于库存扫描');
            $table->index('created_by', 'idx_variant_created_by')->comment('创建人索引，用于审计查询');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('product_variants');
    }
};
